using System.Windows;
using Microsoft.Practices.Prism.Events;
using Microsoft.Practices.Unity;

namespace Ausy.Silverlight.VideoPlayer.Infrastructure.Common
{
    /// <summary>
    /// Classe de base utilisée pour les ViewModels associés à une View
    /// </summary>
    /// <typeparam name="TView"></typeparam>
    public abstract class ViewModel<TView> : ViewModel
    {
        #region Private Members

        /// <summary>
        /// Container Unity pour instanciation des type d'objet
        /// </summary>
        protected readonly IUnityContainer container;

        /// <summary>
        /// Gestionnaire d'Evènement
        /// </summary>
        protected readonly IEventAggregator eventAggregator;

        #endregion

        #region View Property

        /// <summary>
        /// Vue à utliser 
        /// </summary>
        public TView View { get; protected set; }

        #endregion

        #region Constructor

        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        /// <param name="container">Container IoC</param>
        public ViewModel(IUnityContainer container)
        {
            this.container = container;

            // Récupération d'un instance de Vue
            this.View = this.container.Resolve<TView>();
            this.eventAggregator = this.container.Resolve<IEventAggregator>();

            // Initialisation du ViewModel
            this.Initialize();

            // Affectation du DataContext
            var elementView = this.View as FrameworkElement;
            if (elementView != null)
            {
                elementView.DataContext = this;
            }
        }

        #endregion
    }
}